'use strict';
var vk; // 全局vk实例
// 涉及的表名
const dbName = {
	//test: "vk-test", // 测试表
};

// 快递查询的授权码
// 购买渠道：https://market.aliyun.com/products/57126001/cmapi010996.html?spm=5176.2020520132.101.2.32a67218x8bgzY#sku=yuncode499600008
// 此渠道比快递100便宜很多，但不支持电子面单，需要电子面单的请使用快递100接口
const AppCode = ""; // 授权码

const Authorization = `APPCODE ${AppCode}`; // 这个Authorization不要改，只需要改上面的AppCode变量

var db = uniCloud.database(); // 全局数据库引用
var _ = db.command; // 数据库操作符
var $ = _.aggregate; // 聚合查询操作符
/**
 * 权限注意：
 * pub_ 开头的函数不需要登录即可访问 如：pub_getList
 * kh_ 开头的函数需要登录才能访问 如：kh_getList
 * sys_ 开头的函数需要授权指定权限才能访问 如：sys_getList
 * _ 开头的函数禁止前端访问 如：_before
 * 其他函数 默认均需要登录才能访问 如：getList（若将云对象文件放在pub目录下，则默认其他函数不需要登录即可访问，若放在sys目录下，则默认其他函数需要授权才能访问）
 */
var cloudObject = {
	isCloudObject: true, // 标记为云对象模式
	/**
	 * 请求前处理，主要用于调用方法之前进行预处理，一般用于拦截器、统一的身份验证、参数校验、定义全局对象等。
	 */
	_before: async function() {
		vk = this.vk; // 将vk定义为全局对象
		if (!AppCode) {
			return { code: -1, msg: `未配置AppCode` };
		}
		// let { customUtil, uniID, config, pubFun } = this.getUtil(); // 获取工具包
	},
	/**
	 * 请求后处理，主要用于处理本次调用方法的返回结果或者抛出的错误
	 */
	_after: async function(obj) {
		let { err, res } = obj;
		if (err) {
			return; // 如果方法抛出错误，直接return;不处理
		}
		return res
	},
	/**
	 * 根据快递单号查询快递信息
	 * @url plugs/express.getInfo 前端调用的url参数地址
	 */
	getInfo: async function(data) {
		let { uid } = this.getClientInfo(); // 获取客户端信息
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			com = "auto",
				no,
				phone
		} = data;
		if (phone) {
			phone = phone.substring(phone.length-4);
		}
		let keyName = `pub-express-${com}-${no}-${phone}`;
		// 读取缓存
		let requestRes = await vk.globalDataCache.get(keyName);
		if (!requestRes) {
			// 若无缓存时的请求
			requestRes = await vk.request({
				url: `https://ali-deliver.showapi.com/showapi_expInfo`,
				method: "GET",
				headers: {
					Authorization
				},
				data: {
					com,
					nu: no,
					phone
				}
			});
			if (requestRes.showapi_res_code !== 0) {
				await vk.globalDataCache.del(keyName);
				return { code: -1, msg: "未授权", requestRes };
			}
			// 请求成功的才缓存
			await vk.globalDataCache.set(keyName, requestRes, 3600 * 6);
		}
		res.data = requestRes.showapi_res_body;
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 根据单号查询快递公司
	 * @url plugs/express.getExpressCom 前端调用的url参数地址
	 */
	getExpressCom: async function(data) {
		let { uid } = this.getClientInfo(); // 获取客户端信息
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			no,
		} = data;
		let requestRes = await vk.request({
			url: `https://ali-deliver.showapi.com/fetchCom`,
			method: "GET",
			headers: {
				Authorization
			},
			data: {
				nu: no,
			}
		});
		if (requestRes.showapi_res_code !== 0) {
			return { code: -1, msg: "未授权", requestRes };
		}
		res.data = requestRes.showapi_res_body;


		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取快递公司代码列表（一般用不到此接口）
	 * @url plugs/express.getExpressList 前端调用的url参数地址
	 */
	getExpressList: async function(data) {
		let { uid } = this.getClientInfo(); // 获取客户端信息
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			expName,
			maxSize = 10000,
			page
		} = data;
		let requestRes = await vk.request({
			url: `https://ali-deliver.showapi.com/showapi_expressList`,
			method: "GET",
			headers: {
				Authorization
			},
			data: {
				expName,
				maxSize,
				page
			}
		});
		if (requestRes.showapi_res_code !== 0) {
			return { code: -1, msg: "未授权", requestRes };
		}
		res.data = requestRes.showapi_res_body;
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	}
};

module.exports = cloudObject;
